WebAssembly Table Managerãæ·±ãæãäžãã颿°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ãçè§£ããå¹ççãã€ã»ãã¥ã¢ãªWasmã¢ããªã±ãŒã·ã§ã³ã®ããã«é¢æ°åç §ã广çã«ç®¡çããæ¹æ³ã解説ããŸãã
WebAssembly Table Manager: 颿°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ã培åºè§£èª¬
WebAssembly (Wasm) ã¯ããŠã§ããã©ãŠã¶ããã®ä»ã®å€æ§ãªç°å¢ã§ã³ãŒããå®è¡ããããã®ããŒã¿ãã«ã§å¹ççãã€ã»ãã¥ã¢ãªæ¹æ³ãæäŸãããœãããŠã§ã¢éçºã®ç¶æ³ãå€é©ããŠããŸããWasm ã®æ©èœã®æ žãšãªãã³ã³ããŒãã³ãã¯ã颿°åç §ã®ç®¡çãæ ã Table Manager ã§ãã颿°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ãçè§£ããããšã¯ãå¹ççã§ã»ãã¥ã¢ãª WebAssembly ã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ãããã®èšäºã§ã¯ãTable Manager ãšé¢æ°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ã®è€éãã«æ·±ãèžã¿èŸŒã¿ãäžçäžã®éçºè åãã«å æ¬çãªã¬ã€ããæäŸããŸãã
WebAssemblyã®ããŒãã«ãšã¯ïŒ
WebAssembly ã«ãããŠãããŒãã«ã¯åç §ãæ ŒçŽãããªãµã€ãºå¯èœãªé åã§ãããããã®åç §ã¯ãç¹å®ã® Wasm ã¢ãžã¥ãŒã«ã«å¿ããŠã颿° (颿°åç §) ããã®ä»ã®ããŒã¿ãæãããšãã§ããŸããããŒãã«ãã«ãã¯ã¢ããã¡ã«ããºã ãšããŠèããŠã¿ãŠãã ãããã€ã³ããã¯ã¹ãæäŸãããšãããŒãã«ã¯é¢é£ãã颿°ãŸãã¯ããŒã¿ãååŸããŸããããã«ãããWasm ã¢ãžã¥ãŒã«å ã§åçãªé¢æ°åŒã³åºããšé¢æ°ãã€ã³ã¿ã®å¹ççãªç®¡çãå¯èœã«ãªããŸãã
ããŒãã«ã¯ WebAssembly ã®ç·åœ¢ã¡ã¢ãªãšã¯ç°ãªããŸããç·åœ¢ã¡ã¢ãªã Wasm ã³ãŒãã§äœ¿çšãããå®éã®ããŒã¿ãä¿æããã®ã«å¯ŸããããŒãã«ã¯äž»ã« Wasm ã¢ãžã¥ãŒã«ã®ä»ã®éšåãžã®åç §ãæ ŒçŽãã鿥çãªé¢æ°åŒã³åºãã颿°ãã€ã³ã¿ããªããžã§ã¯ãåç §ã容æã«ããŸãããã®åºå¥ã¯ãWasm ãã©ã®ããã«ãªãœãŒã¹ã管çããã»ãã¥ãªãã£ã確ä¿ããããçè§£ããããã«äžå¯æ¬ ã§ãã
WasmããŒãã«ã®äž»ãªç¹åŸŽ:
- ãªãµã€ãºå¯èœ: ããŒãã«ã¯åçã«æ¡åŒµã§ããå¿ èŠã«å¿ããŠããå€ãã®é¢æ°åç §ãå²ãåœãŠãããšãã§ããŸããããã¯ãåçã«é¢æ°ãããŒãããã³ç®¡çããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ã§ãã
- åä»ã: åããŒãã«ã«ã¯ç¹å®ã®èŠçŽ åããããããŒãã«å ã«æ ŒçŽãããå€ã®åãæ±ºå®ããŸãã颿°ããŒãã«ã¯éåžžãç¹ã«é¢æ°åç §ãæ ŒçŽããããã«èšèšãããåä»ãã§ãããã®åå®å šæ§ã¯ãå®è¡æã«æ£ããåã®ããŒã¿ãã¢ã¯ã»ã¹ãããããšãä¿èšŒããããšã§ãå šäœçãªã»ãã¥ãªãã£ãšããã©ãŒãã³ã¹ã«è²¢ç®ããŸãã
- ã€ã³ããã¯ã¹ããŒã¹ã®ã¢ã¯ã»ã¹: 颿°åç §ã¯æŽæ°ã€ã³ããã¯ã¹ã䜿çšããŠã¢ã¯ã»ã¹ãããé«éã§å¹ççãªã«ãã¯ã¢ããã¡ã«ããºã ãæäŸããŸãããã®ã€ã³ããã¯ã¹ã·ã¹ãã ã¯ãç¹ã«è€éãªã¢ããªã±ãŒã·ã§ã³ã§é »ç¹ã«äœ¿çšããã鿥颿°åŒã³åºããå®è¡ããéã«ãããã©ãŒãã³ã¹ã«ãšã£ãŠéèŠã§ãã
- ã»ãã¥ãªãã£ãžã®åœ±é¿: ããŒãã«ã¯ã颿°ã¢ãã¬ã¹ãžã®ã¢ã¯ã»ã¹ç¯å²ãå¶éããäžæ£ãªã¡ã¢ãªã¢ã¯ã»ã¹ãã³ãŒãå®è¡ãé²ãããšã§ãã»ãã¥ãªãã£ã«ãããŠéèŠãªåœ¹å²ãæãããŸããæ³šææ·±ãããŒãã«ç®¡çã¯ãæœåšçãªã»ãã¥ãªãã£è匱æ§ã軜æžããããã«äžå¯æ¬ ã§ãã
颿°ããŒãã«ã®ã©ã€ããµã€ã¯ã«
颿°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ã¯ãWebAssembly ç°å¢å ã§ã®é¢æ°åç §ã®äœæãåæåãå©çšããããŠæçµçãªç Žæ£ãå«ã¿ãŸãããã®ã©ã€ããµã€ã¯ã«ãçè§£ããããšã¯ãå¹ççã§ã»ãã¥ã¢ããããŠä¿å®æ§ã®é«ã Wasm ã¢ããªã±ãŒã·ã§ã³ãéçºããããã«éåžžã«éèŠã§ããäž»èŠãªãã§ãŒãºã詳ããèŠãŠãããŸãããã
1. äœæãšåæå
颿°ããŒãã«ã¯ãã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹åãã§ãŒãºäžã«äœæãããåæåãããŸããWasm ã¢ãžã¥ãŒã«ã¯ãããŒãã«ã®åæãµã€ãºãšä¿æããèŠçŽ ã®åãå®çŸ©ããŸããåæãµã€ãºã¯ãéå§æã«ããŒãã«ãå«ãããšãã§ããèŠçŽ ã®æ°ã§æå®ãããããšãå€ãã§ããèŠçŽ åã¯éåžžãããŒãã«ã颿°åç § (ããªãã¡ã颿°ãã€ã³ã¿) ãå«ãããšãæå®ããŸãã
åæåæé :
- ããŒãã«å®çŸ©: Wasm ã¢ãžã¥ãŒã«ã¯ããã®ã¢ãžã¥ãŒã«æ§é å
ã§ããŒãã«ã宣èšããŸãããã®å®£èšã¯ãããŒãã«ã®å (éåžž
funcrefãŸãã¯é¡äŒŒã®é¢æ°åç §å) ãšããã®åæãµã€ãºããã³æå€§ãµã€ãºãæå®ããŸãã - å²ãåœãŠ: WebAssembly ã©ã³ã¿ã€ã ã¯ãã¢ãžã¥ãŒã«å®çŸ©ã§æå®ãããåæãµã€ãºã«åºã¥ããŠãããŒãã«ã®ã¡ã¢ãªãå²ãåœãŠãŸãã
- å€ã®æ ŒçŽ (ãªãã·ã§ã³): æåã¯ãããŒãã«ã null 颿°åç §ã§åããããããšããããŸãããããã¯ãããŒãã«ã¯äºåã«å®çŸ©ããã颿°ãžã®åç §ã§åæåãããããšããããŸãããã®åæåããã»ã¹ã¯ãå€ãã®å Žåãã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹åæã«è¡ãããŸãã
äŸ (æ¶ç©ºã®Wasmã¢ãžã¥ãŒã«æ§æã䜿çš):
(module
(table (export "myTable") 10 20 funcref)
...;
)
ãã®äŸã§ã¯ãmyTable ãšããååã®ããŒãã«ãäœæãããŸãããã®ããŒãã«ã¯ãæåã¯10åã®é¢æ°åç
§ãä¿æã§ããæå€§å®¹éã¯20åã®é¢æ°åç
§ã§ããfuncref ã¯ãããŒãã«ã颿°åç
§ãæ ŒçŽããããšã瀺ããŸãã
2. ããŒãã«ãžã®é¢æ°ã®è¿œå
颿°ã¯ãWebAssembly ã¢ãžã¥ãŒã«ã® elem ã»ã¯ã·ã§ã³ã䜿çšããããWasm ã©ã³ã¿ã€ã ãæäŸããçµã¿èŸŒã¿é¢æ°ãåŒã³åºãããšã«ãã£ãŠãããŒãã«ã«è¿œå ãããŸããelem ã»ã¯ã·ã§ã³ã䜿çšãããšãããŒãã«ã®åæå€ãæå®ã§ããã€ã³ããã¯ã¹ãšé¢æ°åç
§ããããã³ã°ããŸãããããã®é¢æ°åç
§ã¯ãçŽæ¥çãŸãã¯éæ¥çã§ããå¯èœæ§ããããŸããããŒãã«ã«é¢æ°ã远å ããããšã¯ãã³ãŒã«ããã¯ããã©ã°ã€ã³ã·ã¹ãã ãããã³ Wasm ã¢ãžã¥ãŒã«å
ã®ãã®ä»ã®åçãªåäœãæå¹ã«ããããã«éèŠã§ãã
elem ã»ã¯ã·ã§ã³ã䜿çšãã颿°ã®è¿œå (äŸ):
(module
(table (export "myTable") 10 funcref)
(func $addOne (param i32) (result i32) (i32.add (local.get 0) (i32.const 1)))
(func $addTwo (param i32) (result i32) (i32.add (local.get 0) (i32.const 2)))
(elem (i32.const 0) $addOne $addTwo) ;; index 0: $addOne, index 1: $addTwo
...;
)
ãã®äŸã§ã¯ã$addOne ãš $addTwo ã®2ã€ã®é¢æ°ããããããã€ã³ããã¯ã¹0ãš1ã§ããŒãã«ã«è¿œå ãããŸããelem ã»ã¯ã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹åæã«ãããã®é¢æ°ã察å¿ããããŒãã«ã€ã³ããã¯ã¹ã«ãããã³ã°ããŸããã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹ååŸãããŒãã«ã¯ããŒã¿ãæ ŒçŽãããäœ¿çšæºåãæŽããŸãã
ã©ã³ã¿ã€ã ã§ã®é¢æ°è¿œå (æ¶ç©ºã® Wasm API ã䜿çš): çŸåšãããŒãã«ã®ã©ã³ã¿ã€ã ã§ã®å€ã®æ ŒçŽã«é¢ããæšæºã¯ãããŸããããããã¯æŠå¿µã説æãããã®ã§ãã以äžã¯åãªãäŸã§ãããæ¡åŒµæ©èœãŸãã¯å®è£ åºæã® API ãå¿ èŠãšãªããŸãã
// Hypothetical example. Not standard Wasm API
const wasmInstance = await WebAssembly.instantiate(wasmModule);
const table = wasmInstance.instance.exports.myTable;
const addThreeFunction = wasmInstance.instance.exports.addThree; // Assume this function is exported
table.set(2, addThreeFunction); // Add addThree to index 2
æ¶ç©ºã®ã©ã³ã¿ã€ã ã®äŸã§ã¯ãããŒãã«ãååŸããç¹å®ã®ããŒãã«ã¹ãããã«åçã«é¢æ°åç §ãé 眮ããŠããŸããããã¯ãæè»æ§ãšåçãªã³ãŒãããŒãã«ãšã£ãŠéèŠãªåŽé¢ã§ãã
3. 颿°å®è¡ (鿥åŒã³åºã)
颿°ããŒãã«ã®äž»ãªçšéã¯ã鿥颿°åŒã³åºãã容æã«ããããšã§ãã鿥åŒã³åºãã«ãããããŒãã«å ã®ã€ã³ããã¯ã¹ã«åºã¥ããŠé¢æ°ãåŒã³åºãããšãã§ããã³ãŒã«ããã¯ã颿°ãã€ã³ã¿ãåçãã£ã¹ããããå®è£ ããããšãå¯èœã«ãªããŸãããã®åŒ·åãªã¡ã«ããºã ã¯ãWebAssembly ã¢ãžã¥ãŒã«ã«é«ãæè»æ§ããããããæ¡åŒµå¯èœã§ã¢ãžã¥ãŒã«åŒã®ã¢ããªã±ãŒã·ã§ã³ã®äœæãå¯èœã«ããŸãã
鿥åŒã³åºãã®æ§æ (Wasmããã¹ã圢åŒã®äŸ):
(module
(table (export "myTable") 10 funcref)
(func $add (param i32 i32) (result i32) (i32.add (local.get 0) (local.get 1)))
(func $multiply (param i32 i32) (result i32) (i32.mul (local.get 0) (local.get 1)))
(elem (i32.const 0) $add $multiply)
(func (export "callFunction") (param i32 i32 i32) (result i32)
(call_indirect (type (func (param i32 i32) (result i32))) (local.get 0) (local.get 1) (local.get 2))
) ;
)
ãã®äŸã§ã¯ãcall_indirect åœä»€ãããŒãã«ãã颿°ãåŒã³åºãããã«äœ¿çšãããŸããcall_indirect ã®æåã®ãã©ã¡ãŒã¿ã¯ããŒãã«ãžã®ã€ã³ããã¯ã¹ã§ãããã©ã®é¢æ°ãåŒã³åºãããæ±ºå®ããŸãããã®åŸã®ãã©ã¡ãŒã¿ã¯ãåŒã³åºããã颿°ã«æž¡ãããŸããcallFunction 颿°ã§ã¯ãæåã®ãã©ã¡ãŒã¿ (local.get 0) ãããŒãã«ãžã®ã€ã³ããã¯ã¹ã衚ããããã«ç¶ããã©ã¡ãŒã¿ (local.get 1 ãš local.get 2) ãéžæããã颿°ãžã®åŒæ°ãšããŠæž¡ãããŸãããã®ãã¿ãŒã³ã¯ãWebAssembly ãåçãªã³ãŒãå®è¡ãšæè»ãªèšèšãå¯èœã«ããæ¹æ³ã®åºæ¬ã§ãã
鿥åŒã³åºãã®ã¯ãŒã¯ãããŒ:
- ã«ãã¯ã¢ãã: ã©ã³ã¿ã€ã ã¯ãæäŸãããã€ã³ããã¯ã¹ã«åºã¥ããŠããŒãã«ãã颿°åç §ãååŸããŸãã
- æ€èšŒ: ã©ã³ã¿ã€ã ã¯ãååŸãã颿°åç §ãæå¹ã§ããã (äŸ: null åç §ã§ã¯ãªãã) ããã§ãã¯ããŸããããã¯ã»ãã¥ãªãã£ã®ããã«äžå¯æ¬ ã§ãã
- å®è¡: ã©ã³ã¿ã€ã ã¯ãåç §ãæã颿°ãå®è¡ããæäŸãããåŒæ°ãæž¡ããŸãã
- æ»ãå€: åŒã³åºããã颿°ã¯çµæãè¿ããŸãããã®çµæã¯ã
call_indirectåŒã®äžéšãšããŠäœ¿çšãããŸãã
ãã®ã¢ãããŒãã«ããããã©ã°ã€ã³ã·ã¹ãã ãã€ãã³ããã³ãã©ãªã©ãããŸããŸãªãã¿ãŒã³ãå¯èœã«ãªããŸããããŒãã«æäœã«ããæªæã®ããã³ãŒãå®è¡ãé²ãããã«ããããã®åŒã³åºããä¿è·ããããšãéèŠã§ãã
4. ããŒãã«ã®ãªãµã€ãº
ããŒãã«ã¯ãWebAssembly ã©ã³ã¿ã€ã ã«ãã£ãŠæäŸãããç¹å®ã®åœä»€ãŸã㯠API ã䜿çšããŠãã©ã³ã¿ã€ã æã«ãªãµã€ãºã§ããŸããããã¯ãåçãªæ°ã®é¢æ°åç §ã管çããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ã§ãããªãµã€ãºã«ãããåæãµã€ãºãäžååãªå Žåã«ããŒãã«ãããå€ãã®é¢æ°ãå容ã§ããããã«ãªãããŸããããŒãã«ããã£ã±ãã§ã¯ãªããšãã«çž®å°ããŠã¡ã¢ãªäœ¿çšéãæé©åããã®ã«åœ¹ç«ã¡ãŸãã
ãªãµã€ãºã®èæ ®äºé :
- ã»ãã¥ãªãã£: ãããã¡ãªãŒããŒãããŒãäžæ£ãªã¢ã¯ã»ã¹ãªã©ã®è匱æ§ãé²ãããã«ãããŒãã«ããªãµã€ãºããéã«ã¯é©åãªå¢çãã§ãã¯ãšã»ãã¥ãªãã£å¯Ÿçãäžå¯æ¬ ã§ãã
- ããã©ãŒãã³ã¹: é »ç¹ãªããŒãã«ã®ãªãµã€ãºã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãããªãµã€ãºæäœãæå°éã«æããããã«ãé©åãªåæãµã€ãºãšååãªæå€§ãµã€ãºãèšå®ããããšãæ€èšããŠãã ããã
- ã¡ã¢ãªå²ãåœãŠ: ããŒãã«ã®ãªãµã€ãºã¯ã¡ã¢ãªå²ãåœãŠãããªã¬ãŒããå¯èœæ§ããããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããååãªã¡ã¢ãªãå©çšã§ããªãå Žåã«å²ãåœãŠå€±æã«ã€ãªããå¯èœæ§ããããŸãã
äŸ (æ¶ç©ºã®ãªãµã€ãº - äŸç€º): çŸåšãWebAssembly ã¢ãžã¥ãŒã«å ããããŒãã«ããªãµã€ãºããæšæºçãªæ¹æ³ã¯ãããŸããããã ããã©ã³ã¿ã€ã ã¯ãã°ãã°ãã®ããã® API ãæäŸããŸãã
// Hypothetical JavaScript example. Not standard Wasm API.
const wasmInstance = await WebAssembly.instantiate(wasmModule);
const table = wasmInstance.instance.exports.myTable;
const currentSize = table.length; // Get the current size
const newSize = currentSize + 10; // Resize to add 10 slots
//This assumes a hypothetical function or API on the 'table' object
// table.grow(10) // Grow the table by 10 elements.
ãã®äŸã§ã¯ãgrow() 颿° (Wasm ã©ã³ã¿ã€ã ãšãã® API ã§ãµããŒããããŠããå Žå) ãããŒãã«ãªããžã§ã¯ãäžã§åŒã³åºãããããŒãã«ãµã€ãºãåçã«å¢å ãããŠããŸãããªãµã€ãºã«ãããããŒãã«ãåçã¢ããªã±ãŒã·ã§ã³ã®ã©ã³ã¿ã€ã èŠä»¶ãæºããããšãä¿èšŒãããŸãããæ
éãªç®¡çãå¿
èŠã§ãã
5. 颿°åç §ã®åé€ (鿥ç)
颿°åç
§ã¯ãä»ã®èšèªã§ãªããžã§ã¯ããåé€ããã®ãšåãæ¹æ³ã§æç€ºçã«ãåé€ããããããã§ã¯ãããŸããã代ããã«ãããŒãã«å
ã®ã¹ããããå¥ã®é¢æ°åç
§ (ãŸãã¯ããã®é¢æ°ãäžèŠã«ãªã£ãå Žå㯠null) ã§äžæžãããŸããWasm ã®èšèšã¯å¹çæ§ãšãªãœãŒã¹ç®¡çèœåã«çŠç¹ãåœãŠãŠããŸãããé©åãªç®¡çã¯ãªãœãŒã¹ãã³ããªã³ã°ã®éèŠãªåŽé¢ã§ããäžæžãã¯ãå®è³ªçã«åç
§è§£é€ãšåãã§ãããªããªãããã®åŸã®ããŒãã«ã€ã³ããã¯ã¹ã䜿çšãã鿥åŒã³åºãã¯ãå¥ã®é¢æ°ãåç
§ããããnull ããã®ããŒãã«ãšã³ããªã«é
眮ãããå Žåã¯ç¡å¹ãªåç
§ã«ãªããŸãã
颿°åç §ã®åé€ (æŠå¿µ):
// Hypothetical JavaScript example.
const wasmInstance = await WebAssembly.instantiate(wasmModule);
const table = wasmInstance.instance.exports.myTable;
// Assume the function at index 5 is no longer needed.
// To remove it, you can overwrite it with a null reference or a new function
table.set(5, null); // Or, table.set(5, someNewFunction);
ããŒãã«ãšã³ããªã null (ãŸãã¯å¥ã®é¢æ°) ã«èšå®ããããšã§ãåç
§ã¯ä»¥åã®é¢æ°ãæããªããªããŸãããã®ã€ã³ããã¯ã¹ãä»ãããã®åŸã®åŒã³åºãã¯ããšã©ãŒãçæããããããŒãã«å
ã®ãã®ã¹ãããã«æžã蟌ãŸããå
容ã«å¿ããŠãå¥ã®é¢æ°ãåç
§ããŸããããŒãã«å
ã®é¢æ°ãã€ã³ã¿ã管çããŠããããšã«ãªããŸããããã¯ãç¹ã«é·æéå®è¡ãããã¢ããªã±ãŒã·ã§ã³ã«ãããã¡ã¢ãªç®¡çã«ãšã£ãŠéèŠãªèæ
®äºé
ã§ãã
6. ç Žæ£ (ã¢ãžã¥ãŒã«ã¢ã³ããŒã)
WebAssembly ã¢ãžã¥ãŒã«ãã¢ã³ããŒãããããšãããŒãã«ãšãã®äœ¿çšã¡ã¢ãªã¯éåžžãã©ã³ã¿ã€ã ã«ãã£ãŠååãããŸãããã®ã¯ãªãŒã³ã¢ããã¯ã©ã³ã¿ã€ã ã«ãã£ãŠèªåçã«åŠçãããããŒãã«ã«å²ãåœãŠãããã¡ã¢ãªã®è§£æŸã䌎ããŸãããã ããäžéšã®é«åºŠãªã·ããªãªã§ã¯ãããŒãã«å ã®é¢æ°ã«é¢é£ä»ãããããªãœãŒã¹ (äŸãã°ããããã®é¢æ°ã Wasm ã¢ãžã¥ãŒã«ã®çŽæ¥å¶åŸ¡å€ã®ãªãœãŒã¹ã䜿çšããŠããå Žå) ãæåã§ç®¡çããå¿ èŠãããå ŽåããããŸãã
ç Žæ£ãã§ãŒãºã®åäœ:
- ã¡ã¢ãªã®åå©çš: ã©ã³ã¿ã€ã ã¯ã颿°ããŒãã«ã«ãã£ãŠäœ¿çšãããŠããã¡ã¢ãªãè§£æŸããŸãã
- ãªãœãŒã¹ã®ã¯ãªãŒã³ã¢ãã (æœåšç): ããŒãã«å ã®é¢æ°ãå€éšãªãœãŒã¹ã管çããŠããå Žåãã©ã³ã¿ã€ã ã¯ãããã®ãªãœãŒã¹ãèªåçã«ã¯ãªãŒã³ã¢ããããªãå ŽåããããŸããéçºè ã¯ãWasm ã¢ãžã¥ãŒã«å ãŸãã¯å¯Ÿå¿ãã JavaScript API ã§ã¯ãªãŒã³ã¢ããããžãã¯ãå®è£ ããŠããããã®ãªãœãŒã¹ãè§£æŸããå¿ èŠãããå ŽåããããŸãããããè¡ããªããšããªãœãŒã¹ãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããããã¯ãWasm ãå€éšã·ã¹ãã ãç¹å®ã®ãã€ãã£ãã©ã€ãã©ãªé£æºãšããåãããå Žåã«ããé¢é£ããŸãã
- ã¢ãžã¥ãŒã«ã®ã¢ã³ããŒã: Wasm ã¢ãžã¥ãŒã«å šäœãã¡ã¢ãªããã¢ã³ããŒããããŸãã
颿°ããŒãã«ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
颿°ããŒãã«ã®å¹æçãªç®¡çã¯ãWebAssembly ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãããã³ä¿å®æ§ã確ä¿ããããã«äžå¯æ¬ ã§ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãå€ãã®äžè¬çãªåé¡ã鲿¢ããå šäœçãªéçºã¯ãŒã¯ãããŒãæ¹åã§ããŸãã
1. ã»ãã¥ãªãã£ã®èæ ®äºé
- å ¥åæ€èšŒ: ããŒãã«ãä»ããŠé¢æ°ãåŒã³åºãåã«ãããŒãã«ã€ã³ããã¯ã¹ã決å®ããããã«äœ¿çšãããå ¥åã¯åžžã«æ€èšŒããŠãã ãããããã«ãããç¯å²å€ã¢ã¯ã»ã¹ãæœåšçãªãšã¯ã¹ããã€ããé²ãããšãã§ããŸããå ¥åæ€èšŒã¯ãæªæã®ããããŒã¿ããä¿è·ããããã«ãã»ãã¥ãªãã£ãæèããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠãªã¹ãããã§ãã
- å¢çãã§ãã¯: ããŒãã«ã«ã¢ã¯ã»ã¹ããéã«å¢çãã§ãã¯ãå®è£ ããŠãã ããããããã¡ãªãŒããŒãããŒããã®ä»ã®ã¡ã¢ãªã¢ã¯ã»ã¹éåãé²ãããã«ãã€ã³ããã¯ã¹ãããŒãã«èŠçŽ ã®æå¹ãªç¯å²å ã«ããããšã確èªããŠãã ããã
- åå®å šæ§: WebAssembly ã®åã·ã¹ãã ãå©çšããŠãããŒãã«ã«è¿œå ããã颿°ãæåŸ ãããã·ã°ããã£ãæã€ããšã確èªããŠãã ãããããã«ãããåé¢é£ã®ãšã©ãŒãæœåšçãªã»ãã¥ãªãã£è匱æ§ãé²ãããšãã§ããŸããå³å¯ãªåã·ã¹ãã ã¯ãWasm ã®åºæ¬çãªã»ãã¥ãªãã£èšèšã®éžæã§ãããåé¢é£ã®ãšã©ãŒãåé¿ããããã«èšèšãããŠããŸãã
- ä¿¡é Œã§ããªãã³ãŒãã§ã®çŽæ¥çãªããŒãã«ã¢ã¯ã»ã¹ãé¿ãã: WebAssembly ã¢ãžã¥ãŒã«ãä¿¡é Œã§ããªããœãŒã¹ããã®å ¥åãåŠçããå ŽåãããŒãã«ã€ã³ããã¯ã¹ãžã®ã¢ã¯ã»ã¹ãæ éã«å¶éããŠãã ãããæªæã®ããããŒãã«æäœãé²ãããã«ãä¿¡é Œã§ããªãããŒã¿ããµã³ãããã¯ã¹åãŸãã¯ãã£ã«ã¿ãªã³ã°ããããšãæ€èšããŠãã ããã
- å€éšã€ã³ã¿ã©ã¯ã·ã§ã³ã®ã¬ãã¥ãŒ: Wasm ã¢ãžã¥ãŒã«ãå€éšã©ã€ãã©ãªãåŒã³åºããããå€éšäžçãšéä¿¡ãããããå Žåã颿°ãã€ã³ã¿ãæªçšããå¯èœæ§ã®ããæ»æããä¿è·ãããŠããããšã確èªããããã«ããããã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãåæããŠãã ããã
2. ããã©ãŒãã³ã¹æé©å
- ããŒãã«ã®ãªãµã€ãºãæå°éã«æãã: é床ãªããŒãã«ãªãµã€ãºæäœã¯é¿ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ã®äºæ³ãããããŒãºã«åºã¥ããŠãé©åãªåæããã³æå€§ããŒãã«ãµã€ãºã決å®ããŠãã ãããé »ç¹ãªãªãµã€ãºã¯ããã©ãŒãã³ã¹äœäžã«ã€ãªããå¯èœæ§ããããŸãã
- å¹ççãªããŒãã«ã€ã³ããã¯ã¹ç®¡ç: ããŒãã«å ã®é¢æ°ã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããã€ã³ããã¯ã¹ãæ éã«ç®¡çããŠãã ãããäžå¿ èŠãªéæ¥åç §ãé¿ããå¹ççãªã«ãã¯ã¢ããã確ä¿ããŠãã ããã
- 颿°ã·ã°ããã£ã®æé©å: ããŒãã«ã§äœ¿çšããã颿°ã·ã°ããã£ãèšèšããéã«ã¯ããã©ã¡ãŒã¿ã®æ°ãšæž¡ãããããŒã¿ã®ãµã€ãºãæå°éã«æããããã«ããŠãã ãããããã«ããã鿥åŒã³åºãäžã®ããã©ãŒãã³ã¹åäžã«è²¢ç®ã§ããŸãã
- ã³ãŒãã®ãããã¡ã€ãªã³ã°: ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããŒãã«ã¢ã¯ã»ã¹ã鿥åŒã³åºãã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŠãã ãããããã«ãããæé©åãå¿ èŠãªé åãç¹å®ã§ããŸãã
3. ã³ãŒãã®æ§æãšä¿å®æ§
- æç¢ºãªAPIèšèš: 颿°ããŒãã«ãšããåãããããã®æç¢ºã§ååã«ææžåãããAPIãæäŸããŠãã ãããããã«ãããã¢ãžã¥ãŒã«ã®äœ¿çšãšä¿å®ã容æã«ãªããŸãã
- ã¢ãžã¥ãŒã«èšèš: WebAssembly ã¢ãžã¥ãŒã«ãã¢ãžã¥ãŒã«æ¹åŒã§èšèšããŠãã ãããããã«ããã颿°ããŒãã«ã®ç®¡çããå¿ èŠã«å¿ãã颿°ã®è¿œå ãŸãã¯åé€ã容æã«ãªããŸãã
- èšè¿°çãªååã䜿çšãã: 颿°ãããŒãã«ã€ã³ããã¯ã¹ã«ã¯æå³ã®ããååã䜿çšããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããŠãã ããããã®å®è·µã¯ãä»ã®éçºè ãã³ãŒããæ±ããçè§£ããæŽæ°ããèœåãå€§å¹ ã«åäžãããŸãã
- ããã¥ã¡ã³ã: ããŒãã«ã®ç®çãå«ãŸãã颿°ãããã³æåŸ ããã䜿çšãã¿ãŒã³ãææžåããŠãã ãããæç¢ºãªããã¥ã¡ã³ãã¯ãå ±åäœæ¥ãšé·æçãªãããžã§ã¯ãä¿å®ã«äžå¯æ¬ ã§ãã
- ãšã©ãŒåŠç: ç¡å¹ãªããŒãã«ã€ã³ããã¯ã¹ã颿°åŒã³åºãã®å€±æãããã³ãã®ä»ã®æœåšçãªåé¡ãé©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒåŠçãå®è£ ããŠãã ãããé©åã«å®çŸ©ããããšã©ãŒåŠçã«ãããWasm ã¢ãžã¥ãŒã«ã®ä¿¡é Œæ§ãåäžãããããã°ã容æã«ãªããŸãã
é«åºŠãªæŠå¿µ
1. è€æ°ã®ããŒãã«
WebAssembly ã¯ãåäžã®ã¢ãžã¥ãŒã«å ã«è€æ°ã®ããŒãã«ããµããŒãããŠããŸããããã¯ãã«ããŽãªãåããšã«é¢æ°åç §ãæŽçããã®ã«åœ¹ç«ã¡ãŸããè€æ°ã®ããŒãã«ã䜿çšããããšã§ãããå¹ççãªã¡ã¢ãªå²ãåœãŠãšé¢æ°ã«ãã¯ã¢ãããå¯èœã«ãªããããã©ãŒãã³ã¹ãåäžããããšããããŸããè€æ°ã®ããŒãã«ãå©çšããéžæè¢ã¯ã颿°åç §ããã现ãã管çããã³ãŒãã®ç·šæãæ¹åããããšãå¯èœã«ããŸãã
äŸ: ã°ã©ãã£ãã¯é¢æ°çšãšãããã¯ãŒã¯é¢æ°çšã§å¥ã ã®ããŒãã«ãæã€ããšãã§ããŸãããã®çµç¹æŠç¥ã¯ãä¿å®æ§ã«ãããŠå€§ããªå©ç¹ããããããŸãã
(module
(table (export "graphicsTable") 10 funcref)
(table (export "networkTable") 5 funcref)
;; ... function definitions ...
)
2. ããŒãã«ã®ã€ã³ããŒããšãšã¯ã¹ããŒã
ããŒãã«ã¯ãWebAssembly ã¢ãžã¥ãŒã«éã§ã€ã³ããŒãããã³ãšã¯ã¹ããŒãã§ããŸããããã¯ãã¢ãžã¥ãŒã«åŒã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ããããŒãã«ãã€ã³ããŒãããããšã§ãWasm ã¢ãžã¥ãŒã«ã¯å¥ã®ã¢ãžã¥ãŒã«ã§å®çŸ©ããã颿°åç §ã«ã¢ã¯ã»ã¹ã§ããŸããããŒãã«ããšã¯ã¹ããŒããããšãçŸåšã®ã¢ãžã¥ãŒã«ã®é¢æ°åç §ãä»ã®ã¢ãžã¥ãŒã«ã§äœ¿çšã§ããããã«ãªããŸããããã«ãããã³ãŒãã®åå©çšãä¿é²ãããè€éã§æ§æå¯èœãªã·ã¹ãã ã®äœæãå¯èœã«ãªããŸãã
äŸ: ã³ã¢ã©ã€ãã©ãªã® Wasm ã¢ãžã¥ãŒã«ã¯ãäžè¬çã«äœ¿çšããã颿°ã®ããŒãã«ããšã¯ã¹ããŒãã§ããä»ã®ã¢ãžã¥ãŒã«ã¯ãã®ããŒãã«ãã€ã³ããŒãããŠãã®æ©èœãå©çšã§ããŸãã
;; Module A (Exports)
(module
(table (export "exportedTable") 10 funcref)
...;
)
;; Module B (Imports)
(module
(import "moduleA" "exportedTable" (table 10 funcref))
...;
)
3. ã°ããŒãã«å€æ°ãšé¢æ°ããŒãã«ã®é£æº
WebAssembly ã¯ãã°ããŒãã«å€æ°ãšé¢æ°ããŒãã«éã®é£æºãå¯èœã«ããŸããã°ããŒãã«å€æ°ã¯ãããŒãã«ãžã®ã€ã³ããã¯ã¹ãæ ŒçŽã§ããŸããããã«ãããã©ã®é¢æ°ãåŒã³åºãããããåçã«å¶åŸ¡ã§ããè€éãªå¶åŸ¡ãããŒã容æã«ããŸãããã®é£æºãã¿ãŒã³ã«ãããã¢ããªã±ãŒã·ã§ã³ã¯åã³ã³ãã€ã«ãªãã§åäœã倿Žã§ãã颿°ããŒãã«ã颿°ãã€ã³ã¿ãæ ŒçŽããã¡ã«ããºã ãšããŠäœ¿çšããŸãã
äŸ: ã°ããŒãã«å€æ°ã«ç¹å®ã®ã€ãã³ãã§åŒã³åºããã颿°ã®ã€ã³ããã¯ã¹ãä¿æãããããšã§ãã¢ããªã±ãŒã·ã§ã³ã¯ã€ãã³ãã«åçã«å¿çã§ããŸãã
(module
(table (export "myTable") 10 funcref)
(global (mut i32) (i32.const 0)) ;; global variable holding a table index
(func $func1 (param i32) (result i32) ...)
(func $func2 (param i32) (result i32) ...)
(elem (i32.const 0) $func1 $func2)
(func (export "callSelected") (param i32) (result i32)
(call_indirect (type (func (param i32) (result i32))) (global.get 0) (local.get 0))
)
)
ãã®äŸã§ã¯ãglobal 倿°ã callSelected 颿°ãåŒã³åºããããšãã«ã©ã®é¢æ° (func1 ãŸã㯠func2) ãèµ·åãããããæ±ºå®ããŸãã
ããŒã«ãšãããã°
WebAssembly ã®é¢æ°ããŒãã«ã®ç®¡çãšãããã°ãæ¯æŽããããã€ãã®ããŒã«ãå©çšå¯èœã§ãããããã®ããŒã«ãå©çšããããšã§ãéçºã¯ãŒã¯ãããŒãå€§å¹ ã«æ¹åãããããå¹ççã§ãšã©ãŒã®å°ãªãã³ãŒãã£ã³ã°å®è·µãä¿é²ãããŸãã
1. WebAssembly ãããã¬
ããŸããŸãªãããã¬ã WebAssembly ããµããŒãããŠããŸãããããã®ãããã¬ã䜿çšãããšãWasm ã³ãŒããã¹ãããå®è¡ããããŒãã«ã®å
å®¹ãæ€æ»ãããã¬ãŒã¯ãã€ã³ããèšå®ã§ããŸãããããã䜿çšããŠãcall_indirect ã«æž¡ãããã€ã³ããã¯ã¹ã®å€ãæ€æ»ããããŒãã«èªäœã®å
容ã調ã¹ãŸãã
äž»èŠãªãããã¬ã«ã¯ä»¥äžãå«ãŸããŸã:
- ãã©ãŠã¶éçºè ããŒã«: ã»ãšãã©ã®ææ°ã®ãŠã§ããã©ãŠã¶ã«ã¯ãWebAssembly ãããã°æ©èœãçµã¿èŸŒãŸããŠããŸãã
- Wasmtime (ããã³ãã®ä»ã® Wasm ã©ã³ã¿ã€ã ): åããŒã«ãéããŠãããã°ãµããŒããæäŸããŸãã
2. éã¢ã»ã³ãã©
éã¢ã»ã³ãã©ã¯ãWasm ãã€ããªåœ¢åŒã人éãèªããããã¹ã衚çŸã«å€æããŸããéã¢ã»ã³ãã«ãããåºåãåæããããšã§ãããŒãã«æ§é ã颿°åç §ãããã³ããŒãã«ãæäœããåœä»€ã調ã¹ãããšãã§ããŸããéã¢ã»ã³ãã«ã¯ãæœåšçãªãšã©ãŒãæé©åé åãç¹å®ããäžã§éåžžã«äŸ¡å€ããããŸãã
䟿å©ãªããŒã«:
- Wasm éã¢ã»ã³ãã© (äŸ:
wasm-objdump): Wasm ããŒã«ã¹ã€ãŒãã®äžéšã§ãã - ãªã³ã©ã€ã³éã¢ã»ã³ãã©: ããã€ãã®ãªã³ã©ã€ã³ããŒã«ã Wasm éã¢ã»ã³ãã«æ©èœãæäŸããŠããŸãã
3. éçã¢ãã©ã€ã¶
éçè§£æããŒã«ã¯ãWasm ã³ãŒããå®è¡ããã«åæããŸãããããã®ããŒã«ã¯ãç¯å²å€ã¢ã¯ã»ã¹ãåãã¹ããããªã©ãããŒãã«ã¢ã¯ã»ã¹ã«é¢é£ããæœåšçãªåé¡ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸããéçè§£æã¯ãéçºããã»ã¹ã®æ©ã段éã§ãšã©ãŒãæ€åºã§ããããããããã°æéãå€§å¹ ã«ççž®ããWasm ã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãåäžãããŸãã
äŸãšãªãããŒã«:
- Wasmcheck: Wasm ã¢ãžã¥ãŒã«ã®ããªããŒã¿ããã³ã¢ãã©ã€ã¶ã§ãã
4. WebAssembly ã€ã³ã¹ãã¯ã¿
ãããã®ããŒã«ã¯ãå€ãã®å Žåãã©ãŠã¶æ¡åŒµæ©èœã§ãããå®è¡äžã®ãŠã§ãããŒãžå ã§ WebAssembly ã¢ãžã¥ãŒã«ã®ããŸããŸãªåŽé¢ (ã¡ã¢ãªãã°ããŒãã«å€æ°ããããŠç¹ã«ããŒãã«ãšãã®å 容) ãæ€æ»ã§ããŸããããã㯠Wasm ã¢ãžã¥ãŒã«ã®å éšåäœã«é¢ãã貎éãªæŽå¯ãæäŸããŸãã
çµè«
WebAssembly Table Manager ãšé¢æ°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ã¯ãWebAssembly ã®äžå¯æ¬ ãªã³ã³ããŒãã³ãã§ãã颿°åç §ã广çã«ç®¡çããæ¹æ³ãçè§£ããããšã§ãå¹ççã§ã»ãã¥ã¢ããããŠä¿å®æ§ã®é«ã WebAssembly ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããäœæãšåæåãã鿥åŒã³åºããããŒãã«ã®ãªãµã€ãºã«è³ããŸã§ã颿°ããŒãã«ã®ã©ã€ããµã€ã¯ã«ã®åãã§ãŒãºãéèŠãªåœ¹å²ãæãããŸãããã¹ããã©ã¯ãã£ã¹ã«åŸããã»ãã¥ãªãã£ã®èæ ®äºé ãçµã¿èŸŒã¿ãå©çšå¯èœãªããŒã«ã掻çšããããšã§ãWebAssembly ã®æã€èœåãæå€§éã«åŒãåºããã°ããŒãã«ãªããžã¿ã«ç°å¢åãã«å ç¢ã§é«æ§èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãã§ããŸãã颿°åç §ã®æ éãªç®¡çã¯ãäžçäžã®å€æ§ãªç°å¢ã§ Wasm ã®å¯èœæ§ãæå€§éã«åŒãåºãéµãšãªããŸãã
颿°ããŒãã«ã®åãæŽ»çšãããã®ç¥èã WebAssembly éçºã®æ°ããªé«ã¿ãžæŒãäžããããã«å©çšããŸãããïŒ